package com.ming_za.odupdaterserver;

import org.fusesource.jansi.AnsiConsole;
import com.ming_za.odupdaterserver.core.config.ConfigManager;
import com.ming_za.odupdaterserver.core.utils.Msg;
import lombok.Getter;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;

/**
 * 初梦更新器-第二代-服务端源码
 * <pre>
 * 项目创建时间：2025-1-3
 * 开源协议：GPLv3
 * 框架集：SSM
 * 数据库：仅SQLite
 * 作者：ming_za
 * QQ：2510674200
 * </pre>
 * <pre>
 *     未经作者允许禁止任何形式的商用！
 * </pre>
 */
@SpringBootApplication
public class OdUpdaterServerApplication {

	//TODO 新增不同类型资源分类，例如MC mod等，不绑定文件名更新（先放着）
	//TODO 更新客户端获取资源时需要发送一个版本验证，才能获取到不同类型的资源，否则默认为普通资源（先放着）
	//TODO 更新公告（先放着）

    private static final Set<Consumer<Void>> stopFuncSet = new HashSet<>();

	@Getter
	private static final String version = "v1.1.1";

	private static ConfigurableApplicationContext context = null;

    public static void main(String[] args) {
		System.out.println("服务端初始化...");
		if (System.console() != null){
			AnsiConsole.systemInstall();
		}
		SpringApplication app = new SpringApplication(OdUpdaterServerApplication.class);
		app.setBannerMode(Banner.Mode.OFF);
		context = app.run(args);

		String icon = """
    &d             *%*=-:.                    ..:-===+++=:                  .
    &d        .::-+@@@@@@@@%%%%##***+++++*#%%@@@@@@@@@@@@@#+**###*+++*##%%%@@#
    &d    =*#%%@%%%####%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
    &d    ....              .:-=+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#.
    &d         #@@%#*+==+**#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+=--::....:-
    &d        -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#**@@@%#+=:.
    &d     .:+#@@@@@@%#*+*%@@@@@@@@@@@@%#*+=:.   =%%+:
    &d :=#%@@%#+=-:.  .-*%@@@@@@@#*=:..       :+@@@@@@%#+-.
    &d+#*=-.        :*@@@@@@@#=:  :-+#%@@@@@@@@@@@%**++*#%@@#*=----.
    &d            -#@@@@@@*-  .=#@@@@%*=----=====:        .-+#%@@#=.
    &d          -#@@@@@#-  :+@@@@#=:
    &d        -#@@@@@+.  =%@@@*-.
    &d      :#@@@@@=  :*@@@*-
    &d     +@@@@@+  -#@@%=.
    &d    #@@@@*. :%@@@=
    &d   #@@@%-  *@@@*.            .------    ::::::::::::::.          -=====.        ======
    &d  *@@@*  :%@@@+              =@@@@@@:  :%@@@@@@@@@@@@@@#     .--=@@@@@@#--- :--*@@@@@@+---
    &d .@@@+  .@@@@+              :#@@@@@@+.   =@@@@@@.#@@@@@@.    -%%@@@@@@@@@@@.+%%@@@@@@@@%@*
    &d -@@*   #@@@#              .###@@@@@@@.  +@@@@@% #@@@@@@.    :%#%@@@@@@%@@@:=%#%@@@@@@%%%-
    &d -@@.  -@@@@:                  @@@@@@*   #@@@@@% #@@@@@@.    =@@@@@@@@@+#@@=#@@@@@@@@@@@@+
    &d .@#   =@@@%                  +@@@@@@    %@@@@@# #@@@@@@.    #@@*@@@@@@==@@%@@@*@@@@@@%@@#
    &d  #%   :@@@#                 :@@@@@@=+%*.@@@@@@+ #@@@@@@.    :--.+###**. ...:-: *****+.---
    &d  .-    #@@@:                #@@@@@@-#@%:@@@@@@- #@@@@@@.     :%%%%%%*------::---::::::.
    &d        .%@@%:              -@@@@@@@- :.=@@@@@@: #@@@@@@.    :@@@@@@@@@@@@@@@@@@@@@@@@@@+
    &d         .%@@@=            .@@@@@@@@-+%:+@@@@@@: #@@@@@@.   :@@@@@@*             *@@@@@@*
    &d           +%@@%=          .-*@@@@@@-#@-+@@@@@%  #@@@@@@.   .::::::  -%%%%%%=    +@@@@@@*
    &d             -*%@@#-.        :@@@@@@-*@=*@@@@@#  #@@@@@@.            .@@@@@@@.   +@@@@@@*
    &d                .:-+=.       -@@@@@@= ..@@@@@@*  #@@@@@@.             :@@@@@@#   *@@@@@@#
    &d                             +@@@@@@+  :@@@@@@+ -@@@@@@@.    :::::::::-@@@@@@@:  :=-----.
    &d                  .:=+*%%%%#*@@@@@@@:  :######: #######*    -@@@@@@@@##+=--:::::---======--:.
    &d                :*@@@@@@%*===#@@@@@@-                            ..::--=+*#%@@@@@@@@@@@@@@@@@@%*+:
    &d               :@@@@@#-      #@@@@@*#%#*=:.                .:-=+*#%@@@@@@@@@@@@@@@@@@@@@@@#+-:....
    &d               :@@@@#       =@@@@%:  .-*%@@@%#*+=====++*#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+:
    &d                =@@@@-     +@@@@+        .-+#%@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%@@@@@@@%-
    &d                 .=#%@%*+*%@%*-                .:-==========--::...           .:=*%+
    &d                      .:-:..

    &b                                                                     			初梦更新器-第二代
    &a                                                                     	  		--by: ming_za(QQ: 2510674200)
    """;
		Msg.getInstance().soutMsg(icon);
		ConfigManager configManager = context.getBean(ConfigManager.class);
		Msg.getInstance().info("&a当前服务端版本：" + version);
		Msg.getInstance().info("&b定制插件、程序、修复bug联系：ming_za(QQ:2510674200,VX:m2510674200) ovo");
		Msg.getInstance().info("&7若要关闭服务端请使用\"stop\"指令结束程序，而不是直接关闭！(可能引发回档)");
		Msg.getInstance().info("&a更新器端口：" + configManager.getPort());
		Msg.getInstance().info("&b管理界面链接(复制到浏览器打开)：http://127.0.0.1:" + configManager.getPort());
		Msg.getInstance().info("&e输入help查看服务端指令");

	}

	public static void registerStopFunc(Consumer<Void> stopFunc) {
		stopFuncSet.add(stopFunc);
	}

	public static void tryShutdown(){
		onShutdown();
		context.stop();
		System.out.println("更新器服务端已关闭！");
		System.exit(0);
	}

	/**
	 * 程序关闭时调用该方法
	 */
	private static void onShutdown(){
		Msg.getInstance().info("&a正在保存数据...");
		for (Consumer<Void> stopFunc : stopFuncSet) {
			stopFunc.accept(null);
		}
	}

}
